2024 Monaco Grand Prix¶

Bonjour les gestionnaires and welcome to the Fantasy League report for the 2024 Monaco Grand Prix. The Jewel in the Crown as many call it, the glitz and the glam of the streets of Monte Carlo, the home of Charles Leclerc, and the one the drivers look forward to each year. Monaco holds a special place on the calendar for many racing series, but for Formula 1 it is one of the most historical racing circuits in the world, and one that has remained relatively unchanged throughout the history of the sport. We've all seen the iconic images of Ayrton Senna, Kimi Raikkonen, Michael Schumacher, Fernando Alonso, and Daniel Ricciardo celebrating their wins on the streets, amongst many others. Monaco is renowned for it's procession-like race, but on occasion it can throw up an absolutely crazy race, when the conditions are right. So which did we get? Let's get into it.

More rumours this week about Adrian Newey as reports suggest that both he and Max Verstappen are rumoured to be making a dramatic move to Aston Martin for 2025/2026. It comes as no surprise that a move for Newey could mean a move for Verstappen too, but a move like that could potentially bankrupt most of the teams on the grid, especially in this cost-cap era. But a manufacturer like Aston Martin, and a wallet the size of Laurence Stroll's, could certainly afford the duo. The major news that has sparked this rumour is that leaks suggest the world champion is looking to stay with the Honda power unit going forward into the new regulations for 2026. That, of course, would tie him to the classic British brand for the foreseeable future, and it would be quite the tempting offer for the legendary car designer too. Only time will tell on this, but with Alonso signing a new contract and Stroll on a seemingly endless contract, there seems to be a surplus driver issue down in the green team.

McLaren launched their Monaco special livery earlier in the week, celebrating the memory of legendary Brazilian driver, Ayrton Senna. Senna, formally of McLaren, was celebrated in Imola for the anniversary of the fatal crash at the track, but McLaren decided that Monaco was a much more relevant time to celebrate the driver. In their defense, he does hold the Monaco win record. Not in their defense, it's now further away from the actual date that marks the 30th anniversary, and it's not even at the track where everyone else was celebrating. On top of that, the car somehow looked worse than their orange and black number they've been running for the last few years. I'm sure there are some fans out there that enjoyed it, but the yellow on Piastri's helmet reminded me of the early Lewis Hamilton helmets, and it just didn't quite look right.

In [ ]:
import os
import subprocess
import src.dataIO as io
import src.webDataIO as wio

from pathlib import Path

year = 2024
race = 'Monaco'

Grand Prix Report¶

The major story of the weekend was the handling issues of the Red Bull car, which is something that has carried on since the Miami Grand Prix. Both drivers have spent the last three weekends complaining about the lack of precision, grid, and speed of the car that has spent most of the last two years winning every race. It's becoming hard to tell whether this is serious or not but, the results speak for themselves. Max didn't win in Miami, he nearly didn't win in Imola, and you know the story of Monaco already. Both the reigning champion and Sergio Perez struggled throughout all three free practice sessions, with the Dutchman claiming that the car felt like it was on a knife edge in the swimming pool complex. While all of this is happening, Ferrari and McLaren are turning up the heat on the Milton Keynes outfit. It's starting to look like we might have a championship fight; it's still early days, but we could be on for a surprise fight for this title. The second story of the weekend is Kevin Magnussen, who is fast approaching a race ban, and all the drivers are starting to get a little frustrated with the current penalty points system. The system that was designed to remove dangerous drivers from races has never actually banned anyone. Pierre Gasly came pretty close last year in Australia when he collided with his teammate after rejoining the track in an unsafe manner, but the stewards didn't award any penalties due to the collision being between teammates. Magnussen overtook Perez at the top of the table in Miami, and has been getting away with some infringements since. Would this race finally be the race that he gets the ban? Let's find out.

Sprint Qualifying¶

No Sprint Qualifying To Report.

In [ ]:
#wio.outputs_sq_data(
#    year=year,
#    race=race)

Sprint Race¶

No Sprint Race To Report.

In [ ]:
#wio.outputs_sprint_data(
#    year=year,
#    race=race)

Qualifying Report¶

Qualifying was an interesting session to say the least. Let's start with Q1, which saw championship contender Lando Norris barely scrape a lap together in the dying moments to secure progression to Q2. The Brit started his lap with around a minute left on the clock in P18 and just about made it through. It's not uncommon for yellow/red flags on the streets, and if one had been thrown, Lando's weekend would have been a whole different story. Fernando Alonso saw elimination with an early lap with time left on the clock and not enough life in the tyres or fuel in the car to complete another lap as the track ramped. He got caught out by a fast (ish) Daniel Ricciardo and Pierre Gasly as the clocked ticked down to zero. He wasn't alone in a shock elimination, as Sergio Perez was also eliminated early in qualifying. The Mexican driver laughed over the radio as he said it was a "f**king joke man" to his race engineer. I'm still not sure if he means the car, the lap, or himself there. They were joined by Logan Sargeant, Valtteri Bottas, and Guanyu Zhou; the latter of which hasn't made it through to Q2 all season long.

Let's move on to Q2 now, and specifically the Haas drivers. Now, if I had told you that both Haas drivers were showing pace in Monaco 3 or 4 months ago, you'd have laughed, but they were. Nico Hulkenberg managed 12th and his teammate secured 14th place in Q2, but that wasn't the only twist in the tale. Post-qualifying, the two were disqualified from the session for a non-compliant rear wing element. Specifically, the FIA noted that the DRS opening was greater than the allowed 85 mm, which we have seen before with Lewis Hamilton at the 2021 Brazilian Grand Prix and it does indeed result in an instant disqualification. Haas have said that they were caught out by miscommunication between the designers at the factory and the team members doing the legality checks track-side. Supposedly, the element of the old rear wing that used to be the lowest point was in the middle of the wing, and on the new wing it was at the edge - this is an easy mistake to make and is not what we expect from the pinnacle of motorsport. These two were joined by Esteban Ocon, Daniel Ricciardo, and Lance Stroll; the usual trio of drivers we have come to expect in Q2.

With all that settled, it was time for the best 12 minutes of motor racing in the entire calendar, Q3 at the Monaco Grand Prix in the dry. The highest pressure cooker on the planet, the moment the entire weekend has been building to. It was advantage Leclerc after the first run of laps, with the home favourite pipping Oscar Piastri and Max Verstappen to pole. When it came to the second runs, both Piastri and Sainz were able to step it up but Verstappen made a mistake at the first corner and had to back out of the lap. That left just Leclerc to put in the best lap of the weekend and secure the most critical pole position of the season. And this time, he did it without binning it and causing damage to the car. He started ahead of Oscar Piastri, Carlos Sainz, and Lando Norris, with not a Red Bull in the top 5. Solid performances from Yuki Tsunoda, Alex Albon, and Pierre Gasly too, who made it 8th, 9th, and 10th on the grid.

In [ ]:
wio.outputs_qualifying_data(
    year=year,
    race=race)
Pos No Driver Car Q1 Q2 Q3 Laps
1 16 Charles Leclerc LEC Ferrari 1:11.584 1:10.825 1:10.270 26
2 81 Oscar Piastri PIA McLaren Mercedes 1:11.500 1:10.756 1:10.424 24
3 55 Carlos Sainz SAI Ferrari 1:11.543 1:11.075 1:10.518 28
4 4 Lando Norris NOR McLaren Mercedes 1:11.760 1:10.732 1:10.542 27
5 63 George Russell RUS Mercedes 1:11.492 1:10.929 1:10.543 28
6 1 Max Verstappen VER Red Bull Racing Honda RBPT 1:11.711 1:10.745 1:10.567 28
7 44 Lewis Hamilton HAM Mercedes 1:11.528 1:11.056 1:10.621 28
8 22 Yuki Tsunoda TSU RB Honda RBPT 1:11.852 1:11.106 1:10.858 25
9 23 Alexander Albon ALB Williams Mercedes 1:11.623 1:11.216 1:10.948 29
10 10 Pierre Gasly GAS Alpine Renault 1:11.714 1:10.896 1:11.311 30
11 31 Esteban Ocon OCO Alpine Renault 1:11.887 1:11.285 20
NC 27 Nico Hulkenberg HUL Haas Ferrari 1:11.876 1:11.440 20
12 3 Daniel Ricciardo RIC RB Honda RBPT 1:11.785 1:11.482 21
13 18 Lance Stroll STR Aston Martin Aramco Mercedes 1:11.728 1:11.563 17
NC 20 Kevin Magnussen MAG Haas Ferrari 1:11.832 1:11.725 18
14 14 Fernando Alonso ALO Aston Martin Aramco Mercedes 1:12.019 11
15 2 Logan Sargeant SAR Williams Mercedes 1:12.020 12
16 11 Sergio Perez PER Red Bull Racing Honda RBPT 1:12.060 12
17 77 Valtteri Bottas BOT Kick Sauber Ferrari 1:12.512 11
18 24 Zhou Guanyu ZHO Kick Sauber Ferrari 1:13.028 11

Race Report¶

After getting disqualified from qualifying, Haas announced that both their drivers would be starting from the pitlane, but for some reason that didn't happen and I'm still not sure why. If they had, then perhaps we wouldn't be talking about the lap 1 drama that they caused. Let's start with the Sainz-Piastri incident, the Australian driver sustained floor damage at turn 1 as Sainz tried a brave overtake into the first corner of the Grand Prix, running slightly wide and into the side of the McLaren. The Spaniard got a puncture, which turned out to be the saving grace for his weekend as he pulled over at the top of the hill unable to steer through Casino Square. This meant that he was unable to cross over the first sector line before the red flag was thrown, meaning the stewards had no choice but to reset the cars in grid order once Sainz had made it back to the pits. "Red flag?" I hear you say, whatever for? Well Sergio Perez, Kevin Magnussen, and Nico Hulkenberg collided on the exit of turn 1 causing a massive amount of damage. All three drivers were ok, but the real question on everyone's lips was "whose fault was it?". Well, cControversially, I am going to put the majority of the blame on Sergio Perez here. He was ahead going up the hill and can be seen checking his mirrors for Magnussen on his right hand side. I have watched this from several angles, and while it is brave of Kevin to be up the inside there, Sergio looks twice and still closes the gap as if Kevin is going to back out. This is a classic incident of "top team driver in the midfield", where they are used to other drivers having something to lose and backing out of moves like that, but the teams scrapping for 1 point per race, do not back out because it is do or die for them. The stewards disagree with me, and they assigned their blame to Magnussen, who is 2 points away from a race ban. The incident was deemed a lap-one incident and no penalty points were awarded, which really begs the question - what do these penalty points really mean? Alonso got 3 for a ballsy overtake at the Chinese Grand Prix, 2 for brake testing Russell in Australia, and yet Magnussen gets none for this? Even though they deemed him at fault? A serious review of this system is needed.

Sainz-Piastri and Perez-Haas weren't the only lap 1 incidents however, as I'm sure many of you have seen the Grand-Tour-dubbed incident between Ocon and Gasly just before the tunnel. Well they also collided going up the hill after turn 1, as captured by one of the Kick driver's T-cam. Alpine boss Bruno Famin said some pretty harsh words during the race about his lead driver, stating that there would be some "consequences" following the collision between the two drivers where Ocon dived up the inside at Portier and launched himself over Gasly's front wheel. It's still unsure what these consequences are, but many rumours are circling that Ocon will be benched for the Canadian Grand Prix in just over a week's time. It seems pretty harsh to bench a driver after 1 incident, but Ocon has a history of colliding with his team mates. Things are not all hunky-dory at Alpine either. As of the 31st of May, Alpine have sacked their operations directory and it is rumoured that Alonso's manager, Flavio Briatore may be linked to a move back to the team. It's come at a time where Alpine are leaking that they are putting in a bid to sign Adrian Newey, so who knows if it is actually true.

The red flag did allow all of the drivers to change tyres in the pitlane though, which is obviously exactly what the Monaco Grand Prix needed..... a free pit stop at a track where it is nearly impossible to overtake except with a pit-stop-overtake. So that's fun. I am of the opinion, however, that the "mandatory tyre change" rule should be changed to a "mandatory pit stop" which would help in a race where there is a red flag, because technically this doesn't count as a pit stop, or at least it shouldn't, while it does maintain the "repair under red flag" rule that has kept so many drivers in the past, in a race. The race after the red flag was pretty dull in comparison to the opening lap. All of the top 10 drivers, barring Russell, Verstappen, and Hamilton put on a set of the hard compound tyres and went to the end, with race leader Charles Leclerc working closely with his team mate Sainz to back the pack up and prevent an undercut. Verstappen and Hamilton had an exciting moment where they both pitted, but neither benefitted, nor could they attack a slow Russell ahead. Yuki Tsunoda held on to eighth ahead of Albon and Gasly despite being a lap down on Hamilton ahead. But it was the first race in the history of F1 where the top 10 on the grid finished in the top 10 in the race, exactly as they started.

That does mean that Charles Leclerc finally won the Monaco Grand Prix, which is apparently the first time in 93 years of the Monaco Grand Prix (before F1 was a thing) that a home-grown driver has won. If you're still not convinced that this is a big deal, let me remind you of the Monaco curse for Leclerc. Louis Chiron won the Monaco Grand Prix in 1931, which means Leclerc is the first Monegasque driver to win the race while it has been a championship event. It's Leclerc's first win since the Austrian Grand Prix in 2022, it's his sixth ever Grand Prix victory. Now for the curse. Leclerc first took to the streets of Monaco in 2017 when he was racing at Prema Racing in F2. He secured pole position and lead the race until a pit stop before a safety car meant he returned in fourth place only to have a suspension failure in the race. He was also forced to retire from the sprint race that weekend due to electrical issues. In 2018 Leclerc was racing for Alfa Romeo Sauber when, with six laps to go, his brakes failed into the Nouvelle Chicane and ploughed into the rear of heartthrob Brendon Hartley. In 2019, at Ferrari, Leclerc was eliminated in Q1 and started in fifteenth, and he got a bit desperate trying to make up places and got a puncture overtaking Nico Hulkenberg. In 2021 Leclerc secured pole position but did the classic "swimming pool crash" and caused severe damage to the driveshaft and caused a DNS for the pole sitter. In 2022 Ferrari botched the strategy brining both drivers into the pits at the same time, dropping Leclerc down to fourth place. At the 2022 historic Monaco Grand Prix (a week before the F1 Grand Prix), Leclerc span Niki Lauda's 1974 Ferrari into the barriers at La Rascasse. In 2023 he qualified third on the grid but was demoted three places after the stewards deemed he had impeded Lando Norris. So the fact that this time everything went perfectly, is a miracle in itself, because he has certainly had the chance to win it on multiple occasions and only some have been his own fault.

There's really not much else to talk about with how dull the race was, but it was nice to see that both McLaren and Ferrari clearly have turned up the wick on this season, and it bodes well given that we still have a long way to go in this championship. It is highly possible that there will be a fight for the constructors' championship.

In [ ]:
wio.outputs_race_result(
    year=year,
    race=race)
Pos No Driver Car Laps Time/Retired PTS
1 16 Charles Leclerc LEC Ferrari 78 2:23:15.554 25
2 81 Oscar Piastri PIA McLaren Mercedes 78 +7.152s 18
3 55 Carlos Sainz SAI Ferrari 78 +7.585s 15
4 4 Lando Norris NOR McLaren Mercedes 78 +8.650s 12
5 63 George Russell RUS Mercedes 78 +13.309s 10
6 1 Max Verstappen VER Red Bull Racing Honda RBPT 78 +13.853s 8
7 44 Lewis Hamilton HAM Mercedes 78 +14.908s 7
8 22 Yuki Tsunoda TSU RB Honda RBPT 77 +1 lap 4
9 23 Alexander Albon ALB Williams Mercedes 77 +1 lap 2
10 10 Pierre Gasly GAS Alpine Renault 77 +1 lap 1
11 14 Fernando Alonso ALO Aston Martin Aramco Mercedes 76 +2 laps 0
12 3 Daniel Ricciardo RIC RB Honda RBPT 76 +2 laps 0
13 77 Valtteri Bottas BOT Kick Sauber Ferrari 76 +2 laps 0
14 18 Lance Stroll STR Aston Martin Aramco Mercedes 76 +2 laps 0
15 2 Logan Sargeant SAR Williams Mercedes 76 +2 laps 0
16 24 Zhou Guanyu ZHO Kick Sauber Ferrari 76 +2 laps 0
NC 31 Esteban Ocon OCO Alpine Renault 0 DNF 0
NC 11 Sergio Perez PER Red Bull Racing Honda RBPT 0 DNF 0
NC 27 Nico Hulkenberg HUL Haas Ferrari 0 DNF 0
NC 20 Kevin Magnussen MAG Haas Ferrari 0 DNF 0

Fastest Lap¶

Fastest lap this week goes to Lewis Hamilton, who took the fastest lap of the race (a time of 1:14:165) on lap 63 of 78 whilst chasing down Verstappen and Russell ahead. The Dutchman was around 4-tenths of a second slower than the Brit a few laps earlier. But it's no surprise that the lap times of the winning cars were significantly slower as the pace was aimed to prevent undercuts and tyre wear.

In [ ]:
wio.outputs_fastest_lap(
    year=year,
    race=race)
Pos No Driver Car Lap Time of day Time Avg Speed
1 44 Lewis Hamilton HAM Mercedes 63 17:07:47 1:14.165 161.979
2 1 Max Verstappen VER Red Bull Racing Honda RBPT 58 17:01:25 1:14.569 161.101
3 24 Zhou Guanyu ZHO Kick Sauber Ferrari 75 17:26:04 1:14.718 160.780
4 22 Yuki Tsunoda TSU RB Honda RBPT 77 17:27:06 1:14.720 160.776
5 55 Carlos Sainz SAI Ferrari 62 17:06:08 1:14.726 160.763
6 16 Charles Leclerc LEC Ferrari 71 17:17:29 1:15.162 159.830
7 63 George Russell RUS Mercedes 73 17:20:21 1:15.228 159.690
8 2 Logan Sargeant SAR Williams Mercedes 62 17:08:29 1:15.525 159.062
9 10 Pierre Gasly GAS Alpine Renault 77 17:27:26 1:15.625 158.852
10 4 Lando Norris NOR McLaren Mercedes 64 17:08:42 1:15.742 158.606
11 81 Oscar Piastri PIA McLaren Mercedes 73 17:20:10 1:16.281 157.486
12 77 Valtteri Bottas BOT Kick Sauber Ferrari 17 16:07:57 1:16.561 156.910
13 18 Lance Stroll STR Aston Martin Aramco Mercedes 59 17:04:16 1:16.710 156.605
14 23 Alexander Albon ALB Williams Mercedes 77 17:27:20 1:17.060 155.894
15 3 Daniel Ricciardo RIC RB Honda RBPT 46 16:46:52 1:17.172 155.667
16 14 Fernando Alonso ALO Aston Martin Aramco Mercedes 68 17:16:00 1:17.939 154.135

Fantasy League Scores¶

Lineup Scores¶

Ok I think I have waffled enough, let's see what this race has done to the fantasy league standings. First let's begin with the driver/team points for the grid. The data you see below are the current total points and values for each driver and team. Values are taken going into the race and updated for next race after I submit the report.

In [ ]:
weekly_scores = {
    "Name": ["Points", "Value"],
    "Race": [f'{race}'],
    "Ocon": [25, 9.4],
    "Gasly": [27, 8.2],
    "Stroll": [24, 13.3],
    "Alonso": [77, 16.3],
    "Leclerc": [264, 22.6],
    "Sainz": [206, 21.0],
    "Bearman": ["N/A", "N/A"],
    "Magnussen": [29, 9.1],
    "Hulkenberg": [15, 8.0],
    "Bottas": [11, 6.5],
    "Guanyu": [36, 7.5],
    "Norris": [183, 25.4],
    "Piastri": [149, 20.3],
    "Hamilton": [90, 19.4],
    "Russell": [121, 19.5],
    "Tsunoda": [47, 9.3],
    "Ricciardo": [-1, 9.1],
    "Verstappen": [264, 30.4],
    "Perez": [178, 23.4],
    "Albon": [-4, 7.8],
    "Sargeant": [19, 5.9],
    "Alpine": [66, 8.8],
    "Aston Martin": [146, 15.1],
    "Ferrari": [554, 22.1],
    "Haas": [69, 9.2],
    "Kick Sauber": [52, 6.3],
    "McLaren": [388, 24.5],
    "Mercedes": [291, 20.6],
    "RB": [85, 8.8],
    "Red Bull": [599, 28.8],
    "Williams": [27, 6.0]}
root = Path().absolute()
if Path(f'{root}/Data/{year}/Lineup/{race}_Results.json').is_file():
    pass
else:
    io.save_json_dicts(
        out_path=Path(f'{root}/Data/{year}/Lineup_Weekly.json'),
        dictionary=weekly_scores)
subprocess.run(["python", "lineup.py", f'{year}'])
Out[ ]:
CompletedProcess(args=['python', 'lineup.py', '2024'], returncode=0)

Charles Leclerc dominates the weekend this week, taking home a whopping 45 points, nearly double that of Oscar Piastri behind with 27 points. The pair are, unsurprisingly, followed by fellow podium sitter Carlos Sainz with 23 points. In fourth place, and I'm still not sure why but it must have something to do with fastest lap, is Lewis Hamilton with 20 points, the British driver edges out fellow countryman Lando Norris in fifth by 1 point, the McLaren race winner scores 19 this week. Our lowest score this week comes from Kevin Magnussen with -33 points. The Danish driver gets a disqualification and a did not finish points tally, only scoring 1 less than his teammate who technically made it about 20 meters further, Nico scores -32 points. Sergio Perez, also involved in that lap 1 collision scores -20 points, just 1 behind Esteban Ocon who made it half a lap further with -19 points. In fifth place we have Daniel Ricciardo, who brings home a whopping 0 points.

Ferrari are back on the top step this weekend, the Italian outfit collecting a huge tally of 68 points ahead of McLaren in second with 56 points. Mercedes round out the top three with 46 points. These three are, by the way, sensationally outscoring the rest of the field this week, with Aston Martin in fourth with 13 points. It's a tough weekend for Haas, with that double DSQ and double DNF securing them -65 points. Which is basically all the points they had this season so far. Well not quite, but it really has taken a chunk out their tally. Second to last is Alpine with -12, and Red Bull make the bottom three with 8 points this week.

It's all tied at the top after that success in Monaco for home-hero Charles Leclerc, he and the reigning champion Max Verstappen sit at the top of the table with 264 points ahead of Carlos Sainz in second with 206. This weekend really has taken a chunk out of Max's lead. In third place we have Lando Norris with 183, who jumps above Sergio Perez in fourth with 178. Oscar Piastri rounds out the top five, with the Australian slowly getting closer to the top with 149 points. A solid, ish, weekend from Alex Albon this week sees him take a big chunk out of his negative points, the Thai driver is still at the bottom of the table, but now he only has -4 points. Ricciardo's tally remains unchanged and he sits second-to-last with -1 point. Bottas next in third with 11 points, just behind Nico Hulkenberg in fourth with 15. American superstar Logan Sargeant rounds out the bottom five with 19 points.

Red Bull just about maintain their lead at the top of the standings with 599 points, but Ferrari have taken massive chunks out of them this week in second with 554 points. McLaren round out the top three with 388 points. Williams are quietly getting on with it and, although they sit at the bottom of the table with 27 points, they are slowly catching Alpine ahead. Between those two, however, is Kick Sauber with 52. Alpine, with all their struggles, are on 66 points total.

It's worth noting that the worst possible team this week was financially possible. You could have had Magnussen, Hulkenberg, Perez, Ocon, and Ricciardo, with Haas and Alpine as your constructors and scored at least -181, possibly -214 with a double Magnussen.

In [ ]:
points_files = [
    'Driver_Points_Bar.png',
    'Team_Points_Bar.png',
    'Driver_Sum Points.png',
    'Team_Sum Points.png']
directory_path = Path(f'{root}/Data/{year}/Figures/{race}')
file_paths = [Path(f'{directory_path}/{race}_{file}') for file in points_files]
[io.display_img(file_path=path, width=1200, height=720) for path in file_paths]
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
Out[ ]:
[None, None, None, None]

Verstappen's value continues to rise, after the reigning champion won in Imola the week before, he's up $0.2 to a total of $30.4 ahead of Norris in second with a value of $25.4. Perez's value stays constant this week with a cost of $23.4 ahead of Leclerc with $22.6 and Sainz with $21.0 million. Your cheapest driver this week was Logan Sargeant with $5.9, just behind the Kick Sauber pairing of Bottas ($6.5) and Guanyu ($7.5). They're behind Albon and Hulkenberg with a value of $7.8 and $8.0 million. These values were pre-Monaco though, so make sure you grab yourself a bargain as many of these drivers have changed since.

Red Bull's value took a slight increase, with the Milton Keynes outfit going up to $28.8 ahead of McLaren in second with a value of $24.5 and Ferrari with $22.1 million. Williams are the cheapest team with a value of $6.0, behind Kick Sauber ($6.3). Alpine and RB are next with a value of $8.8 million.

In [ ]:
average_files = [
    'Driver_Values_Bar.png',
    'Team_Values_Bar.png',
    'Driver_Average Points.png',
    'Team_Average Points.png']
directory_path = Path(f'{root}/Data/{year}/Figures/{race}')
file_paths = [
    Path(f'{directory_path}/{race}_{file}') for file in average_files]
[io.display_img(file_path=path, width=1200, height=720) for path in file_paths]
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
Out[ ]:
[None, None, None, None]

Taking a quick look at the average points graphs, it comes as no surprise that Leclerc and Verstappen are currently on the same average points; I mean the calculation is literally total points / number of races and they're tied. What is quite staggering is their rolling averages, Leclerc is far more consistent and has probably been a better option for the entire season than Max, as his cheapness (relative) allows for more of a stacked lineup. It's a similar story with the constructors, as Ferrari have been fairly consistent around the 70 points per race weekend, but Red Bull have had high-highs and low-lows. It's food for thought, and only available in this report - not the facebook post. So take that knowledge with you.

Leclerc was your best value for money this week with a points per value of 1.95 ppm, he is leaps ahead of second-place Oscar Piastri with a 1.33 ppm tally and Valtteri Bottas with 1.23 ppm. In fourth place it's Sainz, with a 1.1 ppm, and barely cracking the 1 points per million mark in fifth is Lewis Hamilton with a 1.03 ppm. Your worst driver of the weekend was Nico Hulkenberg, with a points per value of -4.0 ppm. He's closely followed by teammate Kevin Magnussen with -3.63 ppm and Esteban Ocon with -2.02 ppm. In fourth place it's Sergio Perez, with a DNF, coming in at -0.85 ppm. Daniel Ricciardo rounds out the worst five with 0 ppm.

Ferrari were your best team selection this week with 3.06 ppm, way ahead of McLaren and Mercedes in second and third with 2.29 ppm and 2.23 ppm, respectively. Haas were by far your worst team of the week with a -7.07 ppm score. They're significantly worse than Alpine with -1.36 ppm and Red Bull with 0.28 ppm.

ppm = points per million dollars.

In [ ]:
ppv_files = [
    'Driver_Points Per Value_Bar.png',
    'Team_Points Per Value_Bar.png',
    'Driver_Average Points Per Value.png',
    'Team_Average Points Per Value.png']
directory_path = Path(f'{root}/Data/{year}/Figures/{race}')
file_paths = [Path(f'{directory_path}/{race}_{file}') for file in ppv_files]
[io.display_img(file_path=path, width=1200, height=720) for path in file_paths]
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
Out[ ]:
[None, None, None, None]
In [ ]:
subprocess.run(["python", "manager.py", f'{year}'])
Out[ ]:
CompletedProcess(args=['python', 'manager.py', '2024'], returncode=0)

Manager Scores¶

It's time to see what the scores are looking like in the fantasy league between all of you. The scores are fairly wild this week with many of you suffering at the double Haas DNF as, let's be honest, we've all got Haas drivers in the mix because of how expensive everything else is. Our weekly winner this week is Joe and kicktwitchyoutubepremium with a score of 254 points. Joe was entirely rescued from a Hulkenberg negative by a triple Leclerc, Ferrari, and McLaren. In second we have Stefanus and Syahrul with 248, meaning it's likely Stefanus will be at the top of the table. In third it's former Champion Phil and A Little Team in third place with 198 points. It's been a while since Phil made the top 5 but it's nice to see them back. In fourth place it's Pierce and Patrick, with their teams Grazzi#44 and Johnny UniHaas tieing on 195 points. Madlen and Les Eclairs round out the top five with 192 points.

I've been doing this a long time now, this is perhaps our fifth or sixth season, I have really lost track, but I don't think I have ever seen a score this low before; what's super impressive is that it wasn't even intentional. There are members of this league that go out of their way to get the lowest scores possible, and I still think this is the lowest I've ever seen. Adam and Better Luck Next Time Bud take the lowest score of the week with -140 points. It was close though as Andrew and sBinnala Yacht Club are close behind with -136 points. Then it's Jake and One Red Bull Car and Gasly, the former weekly winners, in third with -67 points. Joe makes another "5" mention in fourth with Alpine Sandbags and -57 points. Rounding out the bottom five is Pete and Squeshed Nintendo Racing with -53 points. For reference, the points don't become positive until we reach Stuart in 56th place with 3 points.

Someone needs to do something about Stefanus at the top of the table as I'm getting pretty tired of the copy and paste nice statements about their teams. The rookie manager continues their reign at the top of the table with Haryanto, Syahrul, and Gelael with 1961, 1952, and 1823 points, respectively. In fourth place it's still Patrick and Johnny UniHaas with 1774, and Toby and Hesketh 2.1 round out the top five with 1753 points.

Patrick and Racing No Points hold on to the Golf League top spot with 244 points, but Will and The Big One are reeling them in with 264 points in second. A strong week for Andrew and sBinnala Yacht Club see them jump to third place with 280 points. Joe and alpine sandbags are next with 305 points, ahead of Charlie and Lee Carvallo's F1 Challen in fifth with 319 points.

Our biggest winner this week is Phil and A Little Team who jump up 13 places in the championship standings. Joe, Pierce, and Jo also get a special mention for their ten-place jump for kicktwitchyoutubepremium, Grazzi#44, and GHOST IN THE MACHINE teams. Our biggest loser this week is Jake and One Red Bull Car & Gasly who drop a massive 15 places in the standings, a poor week from a team so confident about the non-sprint race usage of their Extra DRS token. They're joined at the bottom by Phil and BMW Motorrad with a drop of -11 places.

In [ ]:
team_files = [
    'LeagueTeams_Points_Bar.png',
    'LeagueTeams_Sum Points_Bar.png',
    'LeagueTeams_Sum Points.png',
    'LeagueTeams_PositionsGained_Bar.png']
directory_path = Path(f'{root}/Data/{year}/Figures/{race}')
file_paths = [
    Path(f'{directory_path}/{race}_{file}') for file in team_files]
[io.display_img(file_path=path, width=1200, height=720) for path in file_paths]
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
Out[ ]:
[None, None, None, None]

I have finally spotted why the Team Values are wrong, and it's when people use tokens. So I can now get on with fixing it. Stefanus and Syahrul are not worth $248 million, in fact it's only $124 million, which still means they're at the top. They're closely followed by James and Bwoah OnlyFans VIP Racing with a value of $116.7 million, which we know is just being wasted at the moment. In third place it's Phil and BMW Motorrad with a value of $114.1 million, despite plummeting down the table. Will and The Big One are our budget team of the week with a value of $48.6 million, ahead of Stuart and Ferrari Strategists who are running at $51.0 million. In third place it's James and Bwoah Rolex Sipsmith Golf with a value of $51.4 million.

The team with the most bang for their buck this week is Joe and kicktwitchyoutubepremium with a points per value of 2.52 ppm, they are leaps ahead of the rest of the field this week too. At the bottom it's Andrew and sBinnala Yacht Club with a points per value of -2.4 ppm.

In [ ]:
team_files = [
    'LeagueTeams_Values_Bar.png',
    'LeagueTeams_Sum Values.png',
    'LeagueTeams_Points Per Value_Bar.png',
    'LeagueTeams_Average Points Per Value.png']
directory_path = Path(f'{root}/Data/{year}/Figures/{race}')
file_paths = [
    Path(f'{directory_path}/{race}_{file}') for file in team_files]
[io.display_img(file_path=path, width=1200, height=720) for path in file_paths]
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
Out[ ]:
[None, None, None, None]

Stefanus is currently leading the way for total points as a manager, not a surprise given the rookie sensation is currently in the top three spots of the championship standings. Close behind is Josh, the pair are on 5736 and 4475 points, respectively. They're followed by Sebastian who has 4259 points. Our lowest three-team manager is Andrew with a whopping 2263 points across all there teams.

Stefanus takes the average points of the week spot across their teams with 204.33 points, ahead of Toby with 182.0 in second, and Sam CJ with 139.0 points. Jake scores our lowest average manager with -26.67 points across their teams. Pete follows closely, bringing in just 3 points on average this week. Stuart is our third lowest manager, and leader (technically) of the Golf managers this week, with an average score of 38.67 points.

In [ ]:
manager_files = [
    'LeagueManagers_Sum Points_Bar.png',
    'LeagueManagers_Sum Points.png',
    'LeagueManagers_Average Points_Bar.png',
    'LeagueManagers_Sum Average Points.png']
directory_path = Path(f'{root}/Data/{year}/Figures/{race}')
file_paths = [
    Path(f'{directory_path}/{race}_{file}') for file in manager_files]
[io.display_img(file_path=path, width=1200, height=720) for path in file_paths]
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
Out[ ]:
[None, None, None, None]

Manager of the week is Toby with a points per value of 1.63 ppm, ahead of Stefanus and Sam CJ in second and third with 1.32 and 1.24 ppm, respectively. Jake is our worst manager of the week with a -0.26 ppm value. He's behind Pete in second with 0.03 ppm and Adam in third with 0.41 ppm.

In [ ]:
manager_files = [
    'LeagueManagers_Sum Values.png',
    'LeagueManagers_Average Values_Bar.png',
    'LeagueManagers_Points Per Value_Bar.png',
    'LeagueManagers_Average Points Per Value.png']
directory_path = Path(f'{root}/Data/{year}/Figures/{race}')
file_paths = [
    Path(f'{directory_path}/{race}_{file}') for file in manager_files]
[io.display_img(file_path=path, width=1200, height=720) for path in file_paths]
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
Out[ ]:
[None, None, None, None]

The winds of change are blowing in terms of your driver selection process, with a new "most used" driver this week in the form of Yuki Tsunoda. The Japanese driver made 27 of your teams this week, ahead of Verstappen and Hulkenberg with 26 selections. Logan Sargeant, likely because of his value, is in third with 25 selections ahead of Leclerc and Albon with 23. The fifth most selected driver this week was Kevin Magnussen, ouch, with 21 selections. Oliver Bearman is still floating around the grid somewhere, with 2 selections, he's our least used driver ahead of Lance Stroll with 4; that one is likely due to an inflated value because of the team he drivers for. George Russell is the third least selected driver with 6, behind Sergio Perez with 7 and Hamilton with 8.

Ferrari are still the most selected team this week with two more of you choosing the Italian team, they were chosen 32 times this week, ahead of Haas in second with 23 uses. RB are in third with 13 of the 65 team selections. Alpine are the least selected team with only 5 of you choosing to run the French outfit, they're just behind Aston Martin and Mercedes who only made 7 selections. Williams round out the bottom three this week with only 9 uses in our championship.

Max Verstappen is still the most DRS Boosted driver on the grid this week with 25 of you choosing to double his score. Leclerc, perhaps rightly, made 12 this week ahead of Norris with 10. Leclerc was also tripled this week, twice, amongst your teams; this was probably quite a good move considering he topped both scoring sessions. Not many tokens used this week, probably most people accepting their fate with only 2 Extra DRS tokens, 1 Wildcard, and 1 No Negative.

In [ ]:
count_files = [
    'LeagueCounts_Driver_Bar.png',
    'LeagueCounts_Constructor_Bar.png',
    'LeagueCounts_DRS Boost_Bar.png',
    'LeagueCounts_Extra DRS_Bar.png',
    'LeagueCounts_Perks_Bar.png']
directory_path = Path(f'{root}/Data/{year}/Figures/{race}')
file_paths = [
    Path(f'{directory_path}/{race}_{file}') for file in count_files]
[io.display_img(file_path=path, width=1200, height=720) for path in file_paths]
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
Out[ ]:
[None, None, None, None, None]
In [ ]:
count_files = [
    'LeagueSumCounts_Driver.png',
    'LeagueSumCounts_Constructor.png',
    'LeagueSumCounts_DRS Boost.png',
    'LeagueSumCounts_Extra DRS.png',
    'LeagueSumCounts_Perks.png']
directory_path = Path(f'{root}/Data/{year}/Figures/{race}')
file_paths = [
    Path(f'{directory_path}/{race}_{file}') for file in count_files]
[io.display_img(file_path=path, width=1200, height=720) for path in file_paths]
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
Out[ ]:
[None, None, None, None, None]

For more figures, please see the Facebook group album.

In [ ]:
subprocess.run(["python", "league_prizes.py", f'{year}'])
Out[ ]:
CompletedProcess(args=['python', 'league_prizes.py', '2024'], returncode=0)

Prizes¶

Monaco, Jewel of the Crown, was in play this week and you were all playing for the highest score. Well, that prize goes to Joe and kicktwitchyoutubepremium with a score of 254 points. Adam also put their name in the hat for lowest score of the season there with -140 points. The Canadian Grand Prix is next up which is part of The Continental prize for highest points scored at a selection of races around the world. Canada marks the mid-point of this achievement with only Great Britain, Italy, and Mexico remaining after the next race. So we will really start to see who's in with the best shot in that competition and it is pretty close at the moment.

In [ ]:
directory_path = Path(f'{root}/Data/{year}/Figures/Prizes')
file_paths = [
    Path(f'{directory_path}/{file}') for file in
    os.listdir(directory_path) if f'{race}' in file]
[io.display_img(file_path=path, width=1200, height=720) for path in file_paths]
No description has been provided for this image
Out[ ]:
[None]

F1 Play¶

In the F1 play league this week, it's a return to from from Stuart with 3/10 predictions correct. Matty and Josh could only manage 2/10 each. It was quite an easy one to predict with basically all of the top 10 staying the same though, so that's no excuse for these low scores.

That takes the scores to:

Stuart - 19

Josh - 24

Matty - 12

In [ ]:
F1_play = {
    "Stuart S": [3, 5, 2, 4, 0, 2, 0, 3],
    "Matty J": [2, 2, 0, 0, 3, 3, 0, 2],
    "Josh M": [2, 3, 2, 6, 3, 3, 3, 2]}
io.save_json_dicts(
    out_path=Path(f'{root}/Data/{year}/F1_Play.json'),
    dictionary=F1_play)
subprocess.run(["python", "F1_play.py", f'{year}'])
points_files = [
    'Points.png',
    'Sum Points.png',
    'Average Points.png']
directory_path = Path(f'{root}/Data/{year}/Figures/F1_Play')
file_paths = [Path(f'{directory_path}/{race}_F1Play_{file}') for file in points_files]
[io.display_img(file_path=path, width=1200, height=720) for path in file_paths]
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
Out[ ]:
[None, None, None]

Next Up¶

Next up, Canada. The Canadian Grand Prix is always sandwiched into the European leg of the calendar and it usually throws up some weird weather, or incidents. So there's plenty to look forward to. The race starts in a week, so get your teams ready and let's gooooo.